# 获取user_access_token - 使用授权码换取用户令牌
import os
import json
import lark_oapi as lark
from lark_oapi.api.authen.v1 import *

# 环境变量
from dotenv import load_dotenv
load_dotenv()

app_id = os.getenv("FEISHU_APP_ID")
app_secret = os.getenv("FEISHU_APP_SECRET")
auth_code = os.getenv("FEISHU_AUTH_CODE")  # 新增：从环境变量获取授权码
redirect_uri = os.getenv("FEISHU_REDIRECT_URI", "http://localhost:8080/oauth/callback")

def get_user_access_token():
    """使用授权码获取user_access_token（参考官方SDK示例）"""
    
    # 检查必要参数
    if not auth_code:
        print("❌ 错误：未设置FEISHU_AUTH_CODE环境变量")
        print("请先在.env文件中设置: FEISHU_AUTH_CODE=your_authorization_code")
        return None, None, None
    
    try:
        # 创建client - 使用环境变量（参考官方示例）
        client = lark.Client.builder() \
            .app_id(app_id) \
            .app_secret(app_secret) \
            .log_level(lark.LogLevel.DEBUG) \
            .build()

        # 构造请求对象（修正参数名称）
        request = CreateAccessTokenRequest.builder() \
            .request_body(CreateAccessTokenRequestBody.builder()
                .grant_type("authorization_code")  # 固定值
                .app_id(app_id)  # 使用app_id而不是client_id
                .app_secret(app_secret)  # 使用app_secret而不是client_secret
                .code(auth_code)  # 授权码
                .redirect_uri(redirect_uri)  # 回调地址
                .build()) \
            .build()

        # 发起请求（使用v1版本的OAuth接口）
        response = client.authen.v1.access_token.create(request)

        # 处理失败返回（参考官方示例的错误处理）
        if not response.success():
            lark.logger.error(
                f"获取user_access_token失败, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}")
            if response.raw and response.raw.content:
                try:
                    error_detail = json.loads(response.raw.content)
                    print(f"❌ 详细错误: {json.dumps(error_detail, indent=2, ensure_ascii=False)}")
                except:
                    print(f"❌ 原始错误响应: {response.raw.content}")
            return None, None, None

        # 处理业务结果
        lark.logger.info("✅ 成功获取user_access_token")
        
        # 解析响应数据
        token_data = response.data
        user_access_token = getattr(token_data, 'access_token', None)
        refresh_token = getattr(token_data, 'refresh_token', None)
        expires_in = getattr(token_data, 'expires_in', None)
        scope = getattr(token_data, 'scope', None)
        
        # 打印token信息
        print(f"\n=== User Access Token 信息 ===")
        print(f"User Access Token: {user_access_token[:50]}..." if user_access_token else "User Access Token: None")
        print(f"Refresh Token: {refresh_token[:50]}..." if refresh_token else "Refresh Token: None")
        print(f"过期时间: {expires_in} 秒")
        print(f"权限范围: {scope}")
        print(f"Token类型: Bearer")
        
        return user_access_token, refresh_token, expires_in
        
    except Exception as e:
        lark.logger.error(f"获取user_access_token异常: {str(e)}")
        print(f"❌ 异常错误: {str(e)}")
        return None, None, None

def main():
    """主函数"""
    print("🚀 开始获取user_access_token...")
    print(f"📱 App ID: {app_id}")
    print(f"🔗 回调地址: {redirect_uri}")
    print(f"📋 授权码: {auth_code[:20]}..." if auth_code else "📋 授权码: 未设置")
    print()
    
    user_access_token, refresh_token, expires_in = get_user_access_token()
    
    if user_access_token:
        print("\n🎉 成功获取用户访问令牌！")
        print("💡 现在可以使用user_access_token调用飞书用户API了")
    else:
        print("\n❌ 获取用户访问令牌失败")
        print("💡 请检查：")
        print("   1. FEISHU_AUTH_CODE是否正确且未过期（5分钟有效期）")
        print("   2. 授权码是否已被使用过（只能用一次）") 
        print("   3. App ID和App Secret是否正确")
        print("   4. redirect_uri是否与获取授权码时一致")
    
    return user_access_token, refresh_token, expires_in

if __name__ == "__main__":
    user_access_token, refresh_token, expires_in = main()
